package eva.savant.business.material.view

import eva.savant.businessobject.mt.*
import eva.savant.businessobject.gl.Persona
import eva.savant.business.material.service.TSKardex

import javax.faces.convert.Converter

public class TMovimiento extends Bean {

  def isTraspaso= false

  def XMaterialCod='', stock

  def almacenId, persona

  Kardex kardex; TSKardex tsKardex

  def lsMotivo, lsAlmacen, lsAlmacenId


  public void clean(String tipo) {

    isRead= false

    focus= 'ps:personaId:complete'

    isTraspaso= tipo.equals(TRASPASO)

    tipo= tipo.equals(TRASPASO)? EGRESO : tipo

    tsKardex= (TSKardex) getSpringBean('tsKardex')


    entity= new Movimiento(); init()

    entity.tipo= tipo

    entity.fecha= new Date()

    entity.motivo= new Motivo()

    entity.lsKardex= new ArrayList<Kardex>()


    lsEntity= new ArrayList<Movimiento>()


    XMaterialCod= ''

    stock= null

    kardex= new Kardex()

    kardex.almacen= new Almacen()

    kardex.persona= new Persona()

    kardex.material= new Material()


    entity.almacenero= get(Almacenero,'usuario.id=?',usuario.id)

    if(entity.almacenero == null) { addErrorMessage 'El usuario no esta registrado como almacenero'; return }


    lsAlmacen= find(AlmaceneroAlmacen.class,'almacen: almacenero.id=?',entity.almacenero.id)

    if(lsAlmacen?.size() < 1) { addErrorMessage 'El usuario no tiene asignado almacenes'; return }


    lsAlmacenId= new ArrayList();  for(almacen in lsAlmacen) lsAlmacenId.add(almacen.id)


    lsMotivo= find(Motivo.class,'tipo=?',entity.tipo)
  }

  public List findLsEntity() {

    return find(Kardex.class,'movimiento: movimiento.tipo=? and almacen.id in (?) ' +

                             'group by movimiento.id order by movimiento.id desc',entity.tipo,lsAlmacenId)
  }

  public void editEntity(Object id) {

    isRead= true

    entity= get(Movimiento.class,id)
  }

  public void XMaterialFind() {

    kardex.material= get(Material.class,'rapido=?',toInteger(XMaterialCod))

    if(kardex.material == null) kardex.material= get(Material.class, sociedad.id + XMaterialCod)

    if(kardex.material == null) kardex.material= get(Material.class,'barras=?', XMaterialCod)

    if(kardex.material != null) XMaterialSelect()
  }

  public void XMaterialSelect() {

    focus= 'ps:cantidadId:valueId'


    XMaterialCod= kardex.material.codigo

    kardex.almacen= get(Almacen.class,kardex.almacen.id)


    def i= get(Inventario.class,'almacen.id=? and material.id=?',kardex.almacen.id,kardex.material.id)

    stock= i != null ? i.actual : null

    if(i == null && entity.tipo.equals(EGRESO))

    addErrorMessage 'El almacen ' + kardex.almacen.id + ' no tiene el material ' + kardex.material.id

    if(entity.tipo.equals(INGRESO)) kardex.entradaCosto= i.saldoCosto
  }

  public void detailAdd() {

    if(kardex.persona?.id == null) { addErrorMessage 'Debe seleccionar persona origen de mercaderia'; return; }

    if(kardex.material?.id == null) { addErrorMessage 'Debe seleccionar un producto'; return; }


    if((kardex.entradaCantidad < 1 && entity.tipo.equals(INGRESO)) ||

       (kardex.salidaCantidad < 1 && entity.tipo.equals( EGRESO))) {

    addErrorMessage 'La cantidad de producto debe ser mayor a cero'; return; }


    if(kardex.salidaCantidad > stock && entity.tipo.equals(EGRESO)) {

    addErrorMessage'Cantidad solicitado es mayor al saldo disponible del material ' + kardex.material.codigo; return }


    def k= new Kardex()

    k.almacen        = kardex.almacen

    k.material       = kardex.material

    k.persona        = kardex.persona

    k.entradaCantidad= entity.tipo.equals(INGRESO)? kardex.entradaCantidad             : null

    k.entradaCosto   = entity.tipo.equals(INGRESO)? kardex.entradaCosto                : null

    k.entradaValor   = entity.tipo.equals(INGRESO)? k.entradaCantidad * k.entradaCosto : null

    k.salidaCantidad = entity.tipo.equals( EGRESO)? kardex.salidaCantidad              : null


    detailDelete(k)

    entity.lsKardex.add(k)


    kardex= new Kardex()

    kardex.persona= k.persona

    kardex.material= new Material()

    kardex.almacen= new Almacen(id: k.almacen.id)


    XMaterialCod= ''

    stock= null

    focus= 'ps:materialId:valueId'
  }

  public void detailDelete(Kardex kardex) {

    if(isRead) return

    for(int i=0; i < entity.lsKardex.size(); i++)  {

      def k= entity.lsKardex.get(i)

      if(k.almacen.id.equalsIgnoreCase( kardex.almacen.id ) &&

         k.material.id.equalsIgnoreCase(kardex.material.id) &&

         k.persona.id == kardex.persona.id ) { entity.lsKardex.remove(i); break }
    }

  }

  public boolean mergeEntity(Object entity) { alta((Movimiento)entity); entity= (Movimiento) entity

    if(entity.lsKardex?.size() < 1) { addErrorMessage 'El detalle productos esta vacio'; return false }

    if( ! isTraspaso) return tsKardex.saveInKardex(entity)


    entity.motivo= get(Motivo.class,1)

    def movimientoEgreso= tsKardex.saveInKardex(entity)



    def movimientoIngreso= new Movimiento()

    movimientoIngreso.almacenero= get(Almacenero,'usuario.id=?',usuario.id)

    movimientoIngreso.motivo= get(Motivo.class,2)

    movimientoIngreso.fecha= movimientoEgreso.fecha

    movimientoIngreso.documento= movimientoEgreso.documento

    movimientoIngreso.descripcion= movimientoEgreso.descripcion

    movimientoIngreso.tipo= INGRESO

    movimientoIngreso.lsKardex= new ArrayList<Kardex>()

    alta(movimientoIngreso)


    for(k in movimientoEgreso.lsKardex) {

    println 'item: '+k.material.id +' cantidad ' +k.salidaCantidad + ' costo '+k.salidaCosto

      def kardex= new Kardex()

      kardex.persona= new Persona(id: persona.id)

      kardex.material= new Material(id: k.material.id)

      kardex.almacen= new Almacen(id: almacenId)

      kardex.entradaCantidad= k.salidaCantidad

      kardex.entradaCosto= k.salidaCosto

      movimientoIngreso.lsKardex.add(kardex)
    }

    movimientoIngreso= tsKardex.saveInKardex(movimientoIngreso)

    addInfoMessage 'Se registro el EGRESO '+movimientoEgreso.id+' y el INGRESO '+movimientoIngreso.id+' correctamente'

    return true
  }

  public List complete(String value) { return completeLike(Persona.class,'nombre',value) }

  public Converter getConverter() { return converterLike(Persona.class) }

  def getXMaterialConverter() { return converterLike(Material.class) }

  def XMaterialComplete(String value) { return completeLike(Material.class,'nombre',value) }
}
